﻿/* Autor: Achim Schnell */

using System;
using System.Collections.Generic;
using System.ComponentModel;

namespace AppFx.ComponentModel.Descriptive
{
	/// <summary>
	/// Klassen, die diese Schnittstelle implementieren stellen Typinformationen
	/// (speziell zu Eigenschaften) zur Verfügung. 
	/// </summary>
	public interface ITypeDescriptionProvider
	{
		/// <summary>
		/// Gibt eine Liste von Delegaten zurück, welche
		/// das Ausschließen von PropertyDescriptors bei Erstellung ermöglicht.
		/// </summary>
		IList<Func<PropertyDescriptor, bool>> Exclusions { get; set; }

		/// <summary>
		/// Erstellt eine Liste mit PropertyDescriptors zum übergebenen Typ.
		/// </summary>
		/// <param name="instance">Objekt, für dessen Typ die PropertyDescriptors erstellt werden sollen.</param>
		/// <returns>Eine Liste aller erstellten PropertyDescriptors</returns>
		/// <exception cref="T:System.ArgumentNullException">Wird geworfen, wenn der Parameter <paramref name="instance"/> NULL ist.</exception>
		/// <remarks>
		/// Berücksichtigt alle Delegaten in der Liste 'Exclusions'.
		/// </remarks>
		IList<PropertyDescriptor> GetDescriptors(object instance);

		/// <summary>
		/// Erstellt eine Liste mit PropertyDescriptors zum übergebenen Typ.
		/// </summary>
		/// <param name="type">Typ, für den die PropertyDescriptors erstellt werden sollen.</param>
		/// <returns>Eine Liste aller erstellten PropertyDescriptors</returns>
		/// <exception cref="T:System.ArgumentNullException">Wird geworfen, wenn der Parameter <paramref name="type"/> NULL ist.</exception>
		/// <remarks>
		/// Berücksichtigt alle Delegaten in der Liste 'Exclusions'.
		/// </remarks>
		IList<PropertyDescriptor> GetDescriptors(Type type);

		/// <summary>
		/// Erstellt eine Liste mit PropertyDescriptors zum übergebenen Typ.
		/// </summary>
		/// <param name="type">Typ, für den die PropertyDescriptors erstellt werden sollen.</param>
		/// <param name="exclude">Der Delegat um PropertyDescriptors auszuschließen.</param>
		/// <returns>Eine Liste aller erstellten PropertyDescriptors</returns>
		/// <exception cref="T:System.ArgumentNullException">Wird geworfen, wenn der Parameter <paramref name="type"/> NULL ist.</exception>
		/// <remarks>
		/// Berücksichtigt alle Delegaten in der Liste 'Exclusions'.
		/// </remarks>
		IList<PropertyDescriptor> GetDescriptors(Type type, Func<PropertyDescriptor, bool> exclude);

		/// <summary>
		/// Erstellt eine Liste mit PropertyDescriptors zum übergebenen Typ.
		/// </summary>
		/// <param name="instance">Objekt, für dessen Typ die PropertyDescriptors erstellt werden sollen.</param>
		/// <param name="exclude">Der Delegat um PropertyDescriptors auszuschließen.</param>
		/// <returns>Eine Liste aller erstellten PropertyDescriptors</returns>
		/// <exception cref="T:System.ArgumentNullException">Wird geworfen, wenn der Parameter <paramref name="type"/> NULL ist.</exception>
		/// <remarks>
		/// Berücksichtigt alle Delegaten in der Liste 'Exclusions'.
		/// </remarks>
		IList<PropertyDescriptor> GetDescriptors(object instance, Func<PropertyDescriptor, bool> exclude);
	}
}
